#include "server.h"


void * client_thread(void *p){

    ServerInfo  *server_info = (ServerInfo *)p;

    while(1){

        pthread_mutex_lock(&server_info->clients_mutex );
        while(server_info->queue.size <= 0  && server_info->exit_flag == 0){
            pthread_cond_wait(&server_info->cond , &server_info->clients_mutex );
        }

        if(server_info->exit_flag != 0){
            pthread_mutex_unlock(&server_info->clients_mutex );
            pthread_exit(NULL);
        }

        int net_fd = server_info->queue.head->net_fd ;
        deQueue(&server_info->queue);
        pthread_mutex_unlock(&server_info->clients_mutex );

        // 和客户端进行交互
        handle_client(net_fd);
    }
    return 0;
}


void handle_client(int net_fd) {

    ClientInfo client_info;
    memset(&client_info, 0, sizeof(client_info));

    Message msg={0};
    while (1) {
        // 接收客户端发送的消息
        if (receive_message(net_fd, &msg) < 0) {
            perror("接收消息失败");
            break;
        }

        // 根据消息类型处理不同的请求
        switch (msg.type) {
            case MSG_TYPE_REGISTER: {
                // 处理注册请求
                char username[MAX_USERNAME_LEN]={0};
                char password[MAX_PASSWORD_LEN]={0};
                // 这行代码使用 sscanf 函数从 msg.data 中解析用户名和密码
                // "%[^,]" 表示读取逗号之前的所有字符作为用户名
                // ",%s" 表示跳过逗号，然后读取剩余的所有字符作为密码
                // 解析后的用户名存储在 username 变量中，密码存储在 password 变量中
                
                // 可能会发生变动
                sscanf(msg.data, "%[^,],%s", username, password);
                handle_register(net_fd, &client_info , username, password);
                break;
            }
            case MSG_TYPE_LOGIN: {
                // 处理登录请求
                char username[MAX_USERNAME_LEN]={0};
                char password[MAX_PASSWORD_LEN]={0};
                sscanf(msg.data, "%[^,],%s", username, password);
                handle_login(net_fd, &client_info, username, password);
                break;
            }
            case MSG_TYPE_CD:
                // 处理切换目录请求
                handle_cd(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_LS:
                // 处理列出目录内容请求
                handle_ls(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_MKDIR:
                // 处理创建目录请求
                handle_mkdir(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_RM:
                // 处理删除文件或目录请求
                handle_rm(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_PUTS:
                // 处理上传文件请求
                handle_puts(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_GETS:
                // 处理下载文件请求
                handle_gets(net_fd, &client_info, msg.data);
                break;
            case MSG_TYPE_LOGOUT:
                // 处理登出请求
                printf("用户已登出\n");
                return;
            default:
                // 处理未知的消息类型
                printf("未知的消息类型: %d\n", msg.type);
        }
    }
}

